package com.example.admin.interceptor;

// 引入Jwt工具类，用于验证JWT令牌
import com.example.airobotsettings.util.JwtUtil;
// 引入HTTP状态码常量
// 引入Spring的组件注解，用于将该类标识为Spring管理的组件
import com.example.common.utils.ResultCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
// 引入Spring的处理器拦截器接口
import org.springframework.web.servlet.HandlerInterceptor;

// 引入HTTP请求对象
import javax.servlet.http.HttpServletRequest;
// 引入HTTP响应对象
import javax.servlet.http.HttpServletResponse;
// 引入IO异常类
import java.io.IOException;

/**
 * TokenInterceptor类用于拦截HTTP请求并验证请求中的JWT令牌。
 * 该类实现了Spring的HandlerInterceptor接口，并重写了preHandle方法。
 */
@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 该方法在请求处理之前被调用。
     * 用于验证请求中的JWT令牌，如果令牌无效，则返回HTTP 401状态码。
     * @param request  当前的HTTP请求对象
     * @param response 当前的HTTP响应对象
     * @param handler  执行链中的下一个处理器
     * @return 如果令牌有效，则返回true；否则返回false
     * @throws IOException 如果在写入响应时发生I/O错误
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws IOException {
        System.out.println("进入了拦截器，请求路径: " + request.getRequestURI());
        
        /**
         * 排除登录接口，登录接口不需要验证令牌
         */
        if ("/user/login".equals(request.getRequestURI()) || 
            "/user/register".equals(request.getRequestURI()) || 
            "/user/changePassword".equals(request.getRequestURI()) ||
            "/api/candidate/login".equals(request.getRequestURI())){
            return true;
        }
        
        // 从请求头中获取JWT令牌
        String token = request.getHeader("Authorization");
        System.out.println("获取到的token: " + token);
        
        // 验证令牌是否为空或无效
        if (token == null || token.isEmpty()) {
            System.out.println("Token为空");
            handleUnauthorized(response, "Token不能为空");
            return false;
        }
        
        // 移除Bearer前缀（如果存在）
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }
        
        String username = jwtUtil.validateToken(token);
        if (username == null) {
            System.out.println("Token无效或已过期");
            handleUnauthorized(response, "Token无效或已过期");
            return false;
        }
        
        System.out.println("Token验证通过，用户名: " + username);
        return true;
    }
    
    private void handleUnauthorized(HttpServletResponse response, String message) throws IOException {
        ResultCode resultCode = ResultCode.UNAUTHORIZED;
        response.setStatus(resultCode.getCode());
        response.setContentType("application/json;charset=UTF-8");
        String errorJson = String.format("{\"code\":%d,\"message\":\"%s\"}", resultCode.getCode(), message);
        response.getWriter().write(errorJson);
    }
}